#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//int main()
//{
//	int a[5] = { 1, 2, 3, 4, 5 };
//	//&a取的是整个数组的地址，它的类型为int （*）[5],
//	//&a+1表示跳过整个数组，将int (*)[5]类型强制转换为int*
//	//再将值赋给ptr
//	int* ptr = (int*)(&a + 1);
//	//a是数组名，没有单独放在sizeof的内部，也没有取地址，所以a表示数组首元素的地址
//	//首元素的地址+1，就是第二个元素的地址，于是*（a+1）=2
//	//ptr已是int* 类型，-1，指向数组第五个元素的地址，于是*（ptr-1）=5
//	printf("%d,%d", *(a + 1), *(ptr - 1));
//	return 0;
//}
////程序的结果是什么？

//struct Test
//{
//	int Num;//4
//	char* pcName;//4
//	short sDate;//2
//	char cha[2];//2
//	short sBa[4];//8
//
//}* p;//用指针类型定义一个p指针变量
//int main()
//{
//	//p的值为0x100000
//	p = (struct Test*)0x100000;
//	//0x1=0x00001=... 
//	//p是一个结构体指针，+1，表示加一个结构体的大小
//	printf("%p\n", p + 0x1);//0x100014
//	//将结构体指针强制转换为一个（长）整型，为数值，
//	//+1，为0x100001
//	printf("%p\n", (unsigned long)p + 0x1);
//	//将结构体指针强制转换为int*，int*的长度为4
//	//+1，为0x100004
//	printf("%p\n",(unsigned int*)p+0x1);
//	return 0;
//}




int main()
{
	int a[4] = {1,2,3,4};
	//a是数组名，&a就是取到整个数组的地址，+1，跳过整个数组，再
	//转换为int*类型，赋值给ptr1
	int *ptr1 = (int*)(&a+1);
	//a是数组名，a没有单独的放置在sizeof的内部，也没有取地址
	//所以a表示数组首元素的地址，将地址强制转为整型
	//+1,假设地址为0x10000，再经过强制转换+1后，值为0x10001
	//之后强制转换为int*,此时，ptr2的类型为int*
	int* ptr2 = (int*)((int)a+1);
	//%x,输出格式为16进制，ptr1[-1]为4，4的16进制也为4
	//采用小端机器存储，假设左边为低地址，右边为高地址，转换为16进制，数组a在内存中的
	//存储如下：
	printf("%x,%x",ptr1[-1],*ptr2);
	return 0;
}